package practise_stack;

import java.util.LinkedList;
import java.util.Queue;


/**
 * 通过两个队列来实现栈的功能
 */
public class MyStack {
    private Queue<Integer> qu1;
    private Queue<Integer> qu2;
    public MyStack() {
        this.qu1 = new LinkedList<>();
        this.qu2 = new LinkedList<>();
    }
    
    public void push(int x) {
        if(!qu1.isEmpty()) {
            qu1.add(x);
        } else if (!qu2.isEmpty()) {
            qu2.add(x);
        } else {
            //两个都为空，那么就添加到 qu1 中
            qu1.add(x);
        }
    }
    private void remove(Queue<Integer> dest, Queue<Integer> src, int count) {
        //count 表示移动个数
        for (int i = 0; i < count; i++) {
            dest.add(src.poll());
        }
    }
    public int pop() {
        if(!qu1.isEmpty()) {
            //此时还有一个再 qu1 中，它就是"栈顶元素"
            remove(qu2, qu1, qu1.size() - 1);
            return qu1.poll();
        } else if (!qu2.isEmpty()) {
            remove(qu1, qu2, qu2.size() - 1);
            return qu2.poll();
        } else {
            return -1;
        }
    }
    
    public int top() {
        int n = -1;
        if(!qu1.isEmpty()) {
            //此时还有一个再 qu1 中，它就是"栈顶元素"
            remove(qu2, qu1, qu1.size() - 1);
            qu2.add(n = qu1.poll());
            return n;
        } else if (!qu2.isEmpty()) {
            remove(qu1, qu2, qu2.size() - 1);
            qu1.add(n = qu2.poll());
            return n;
        } else {
            return n;
        }
    }
    
    public boolean empty() {
        return qu1.isEmpty() && qu2.isEmpty();
    }
}